package com.ProcessManagement;

import java.io.File;
import java.io.FileNotFoundException;
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;

public class PCBReader {
//    设置为单例模式
    private static PCBReader instance;
    public List<PCB> pcbList;

    private PCBReader() {
//        读取pcb_list.txt文件并获取PCB列表。
        pcbList = readPCBFromFile("src/input/pcb_list.txt");
//        读取pcb对应的指令
        for (PCB pcb : pcbList) {
            String InstructionFileName = "src/input/"+pcb.getProID()+".txt";
            readInstructionFromFile(InstructionFileName, pcb.getProID());
            pcb.setTurnTimes();
        }
    }

    public static synchronized PCBReader getInstance() {
        if (instance == null) {
            instance = new PCBReader();
        }
        return instance;
    }

//    打开pcb_list.txt文件并逐行读取其中的内容。每行数据通过空格进行分割，得到三个部分。
//    如果每行有且仅有三个部分，那么将这三个部分转换为整数，并使用它们创建一个新的PCB对象，然后将其添加到PCB列表中。
    public List<PCB> readPCBFromFile(String fileName) {
        List<PCB> pcbList = new ArrayList<>();

        File file = new File(fileName);
        try {
            Scanner scanner = new Scanner(file);
            while (scanner.hasNextLine()) {
                String line = scanner.nextLine();
                String[] parts = line.split(" ");

                if (parts.length == 4) {
                    int proID = Integer.parseInt(parts[0]);
                    int startTimes = Integer.parseInt(parts[1]);
                    int instructNum = Integer.parseInt(parts[2]);
                    int Priority = Integer.parseInt(parts[3]);
                    // 创建PCB对象并添加到列表中
                    PCB pcb = new PCB(proID, startTimes, instructNum, Priority);
                    pcb.setPSW("null");  // 设置进程状态为null
                    pcb.setEndTimes(0);  // 设置结束时间
                    pcbList.add(pcb);
                }
                else if(parts.length == 3){
                    int proID = Integer.parseInt(parts[0]);
                    int startTimes = Integer.parseInt(parts[1]);
                    int instructNum = Integer.parseInt(parts[2]);
                    int Priority = 0;
                    // 创建PCB对象并添加到列表中
                    PCB pcb = new PCB(proID, startTimes, instructNum, Priority);
                    pcb.setPSW("null");  // 设置进程状态为null
                    pcb.setEndTimes(0);  // 设置结束时间
                    pcbList.add(pcb);
                }
                else System.out.println("文件job_list.txt格式错误!!!");
            }
            scanner.close();
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        }

        return pcbList;
    }

//    读取进程文件中的指令
    public void readInstructionFromFile(String fileName, int ProID) {
        File file = new File(fileName);
        try {
            Scanner scanner = new Scanner(file);
            while (scanner.hasNextLine()) {
                String line = scanner.nextLine();
                String[] parts = line.split(" ");

                if (parts.length == 2) {
                    int instructionNumber = Integer.parseInt(parts[0]);
                    int instructionType = Integer.parseInt(parts[1]);

                    for (PCB pcb : pcbList) {
                        if (pcb.getProID() == ProID){
                            Instruction instruction = new Instruction(instructionNumber, instructionType);
                            pcb.addPcbInfoList(instruction);
                        }
                    }
                }
                else System.out.println("进程文件格式错误!!!");
            }
            scanner.close();
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        }
    }

    // 打印PCB列表中的PCB简单信息
    public void printfPCB(List<PCB> pcbList){
        for (PCB pcb : pcbList) {
            pcb.printPCB();
        }
    }

    // 打印PCB列表中的PCB详细信息
    public void printfPCBInfo(){
        for (PCB pcb : pcbList) {
            pcb.printPCBInfo();
        }
    }

//    返回PCB列表
    public List<PCB> getPCBList() {
    return pcbList;
    }
}